home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / MSDOS / slip.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  5KB  |  255 lines

  1. /* --------------------------------- slip.c --------------------------------- */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* Handler for packet level exchanges (low level). It uses a packet driver
  8.  * as the communications medium. It expects SLIP type packets.
  9.  * Options:
  10.  *  0 interrupt number (usualy 0x65)
  11. */
  12.  
  13. #include "fly.h"
  14. #include "pktdrvr.h"
  15.  
  16. #include <dos.h>
  17.  
  18.  
  19. #define MY_OFF(p)    (((Ushort FAR *)&(p))[0])
  20. #define MY_SEG(p)    (((Ushort FAR *)&(p))[1])
  21.  
  22. #define    PKSSIZE        1024        /* packet-driver's stack size */
  23.  
  24. #define PHLEN        (2*LADDRESS+2+2)
  25. #define PHEAD        (pack->raw-PHLEN)
  26.  
  27. typedef struct port PORT;
  28. struct port {
  29.     int    flags;
  30. #define POF_ON        0x0001
  31.     void (INTERRUPT FAR *pkint) (void);
  32.     int    intno;
  33.     int    netport;
  34.     Uchar    address[LADDRESS];
  35.     int    handle;
  36.     PACKET    *pack;
  37.     int    *stack;
  38.     int    version;
  39.     int    class;
  40.     int    type;
  41.     int    number;
  42.     char    *name;
  43.     int    basic;
  44. };
  45.  
  46. static PORT    ports[] = {
  47.     {0, pkint0},
  48.     {0, pkint1},
  49.     {0, pkint2},
  50.     {0, pkint3}
  51. };
  52. #define    NDEV    (sizeof(ports)/sizeof(ports[0]))
  53.  
  54. static int    nports = 0;        /* number of active ports */
  55.  
  56. LOCAL_FUNC void FAR
  57. SlpReceiver (int dev, Ushort di, Ushort si, Ushort bp, Ushort dx, Ushort cx,
  58.     Ushort bx, Ushort ax, Ushort ds, Ushort es)
  59. {
  60.     PORT    *port;
  61.     PACKET    *pack;
  62.     char    *buff;
  63.  
  64.     st.flags1 |= SF_ASYNC;
  65.     switch (ax) {
  66.     case 0:                /* Space allocate call */
  67.         *&es = *&di = 0;
  68.         if (dev < 0 || dev >= NDEV || cx < 3 || cx > PAKPACKLEN)
  69.             goto badret;
  70.         port = &ports[dev];
  71.         if (!(port->flags & POF_ON))
  72.             goto badret;
  73.         if (port->pack) {
  74.             /* stats... */
  75.             packet_del (port->pack);
  76.             port->pack = 0;
  77.         }
  78.         if (F(pack = packet_new (cx, -1)))
  79.             goto badret;
  80.         port->pack = pack;
  81.         pack->length = cx;
  82.         buff = (char *)PHEAD;
  83.         *&es = MY_SEG (buff);
  84.         *&di = MY_OFF (buff);
  85.         break;
  86.     case 1:                /* Packet complete call */
  87.         if (dev < 0 || dev >= NDEV)
  88.             goto badret;
  89.         port = &ports[dev];
  90.         if (!(port->flags & POF_ON))
  91.             goto badret;
  92.         if (F(pack = port->pack))
  93.             goto badret;
  94.         pack->netport = port->netport;
  95.         pack->address = port->address;        /* from */
  96.  
  97.         packet_deliver (pack);
  98.         port->pack = 0;
  99.         break;
  100.     default:
  101. badret:
  102.         ++STATS_NETERRD;
  103.         break;
  104.     }
  105.     st.flags1 &= ~SF_ASYNC;
  106. }
  107.  
  108. LOCAL_FUNC int NEAR
  109. SlpDriver (void)
  110. {
  111.     int    i;
  112.  
  113.     for (i = 0x0060; i < 0x0080; ++i)
  114.         if (test_for_pd (i))
  115.             return (i);
  116.     return (-1);
  117. }
  118.  
  119. LOCAL_FUNC int NEAR
  120. SlpOptions (PORT *port, char *options)
  121. {
  122.     long    l;
  123.  
  124.     port->intno = (int)(get_niarg (options, 0, &l) ? -1 :  l);
  125.  
  126.     return (0);
  127. }
  128.  
  129. LOCAL_FUNC int FAR
  130. SlpInit (NETPORT *np, char *options)
  131. {
  132.     int    portno;
  133.     PORT    *port;
  134.     Uchar    unit[2];
  135.  
  136.     portno = np->unit-'1';
  137.     if (portno < 0 || portno >= NDEV) {
  138.         MsgEPrintf (-100, "%s.%c: bad port",
  139.             np->NetDriver->name, np->unit);
  140.         return (1);
  141.     }
  142.     port = &ports[portno];
  143.     if (port->flags & POF_ON) {
  144.         MsgEPrintf (-100, "%s: already on", port->address);
  145.         return (1);
  146.     }
  147.  
  148.     memset  (port->address, 0, LADDRESS);
  149.     strncpy ((char *)port->address, np->NetDriver->name, LADDRESS);
  150.     strncat ((char *)port->address, ".", LADDRESS);
  151.     unit[0] = (Uchar)np->unit;
  152.     unit[1] = '\0';
  153.     strncat ((char *)port->address, (char *)unit, LADDRESS);
  154.  
  155.     if (SlpOptions (port, options))
  156.         return (1);
  157.  
  158.     if (-1 == port->intno)
  159.         port->intno = SlpDriver ();
  160.     else if (!test_for_pd (port->intno))
  161.         port->intno = -1;
  162.     if (-1 == port->intno) {
  163.         MsgEPrintf (-100, "%s: no driver", port->address);
  164.         return (1);
  165.     }
  166.     MsgPrintf (-100, "Intno 0x%x", port->intno);
  167.  
  168.     if (F(port->stack = (int *)memory_calloc (PKSSIZE,
  169.                         sizeof (*port->stack)))) {
  170.         MsgEPrintf (-100, "%s: no mem", port->address);
  171.         return (1);
  172.     }
  173.  
  174.     pkinit (portno, SlpReceiver, &port->stack[PKSSIZE]);
  175.  
  176.     port->handle = access_type (port->intno, CL_SERIAL_LINE, ANYTYPE, 0,
  177.         (char FAR *)0, 0, port->pkint);
  178.     if (-1 == port->handle) {
  179.         MsgEPrintf (-100, "%s: no handle", port->address);
  180.         port->stack = memory_cfree (port->stack, PKSSIZE,
  181.                         sizeof (*port->stack));
  182.         return (1);
  183.     }
  184.     if (driver_info (port->intno, port->handle, &port->version,
  185.             &port->class, &port->type, &port->number, &port->name,
  186.             &port->basic)) {
  187.         port->basic = 1;    /* what else ? */
  188.     }
  189.     MsgPrintf (-100, "Basic 0x%x", port->basic);
  190.  
  191.     port->flags |= POF_ON;
  192.     port->netport = np->netport;
  193.     port->pack = 0;
  194.     ++nports;
  195.  
  196.     return (0);
  197. }
  198.  
  199. LOCAL_FUNC void FAR
  200. SlpTerm (NETPORT *np)
  201. {
  202.     int    portno;
  203.     PORT    *port;
  204.  
  205.     portno = np->unit-'1';
  206.     if (portno < 0 || portno >= NDEV)
  207.         return;
  208.     port = &ports[portno];
  209.     if (!(port->flags & POF_ON))
  210.         return;
  211.     release_type (port->intno, port->handle);
  212.     port->flags = 0;
  213.     port->stack = memory_cfree (port->stack, PKSSIZE,
  214.                         sizeof (*port->stack));
  215. }
  216.  
  217. LOCAL_FUNC int FAR
  218. SlpSend (NETPORT *np, PACKET *pack)
  219. {
  220.     int    portno;
  221.     PORT    *port;
  222.     PACKET    *p;
  223.  
  224.     if (0 == pack)
  225.         return (0);
  226.  
  227.     portno = np->unit-'1';
  228.     if (portno < 0 || portno >= NDEV)
  229.         return (1);
  230.     port = &ports[portno];
  231.     if (!(port->flags & POF_ON))
  232.         return (1);
  233.     if (port->basic >= 5) {
  234.         if (F(p = packet_new (-1, -1)))
  235.             return (1);
  236.         memcpy (p, pack, sizeof (*p));
  237.         p->next = np->outgoing;
  238.         np->outgoing = p;
  239.         return (as_send_pkt (port->intno, (char *)PHEAD, p->length,
  240.             pksends));
  241.     } else
  242.         return (send_pkt (port->intno, (char *)PHEAD, pack->length));
  243. }
  244.  
  245. struct NetDriver NEAR NetSlip = {
  246.     "SLIP",
  247.     0,
  248.     NULL,    /* extra */
  249.     SlpInit,
  250.     SlpTerm,
  251.     SlpSend,
  252.     0
  253. };
  254.  
  255.